package com.timothy.business.service;

import com.timothy.business.model.SysMenuEntity;
import com.timothy.dao.entity.IdeaMenu;
import com.timothy.dao.entity.IdeaRole;
import com.timothy.dao.entity.IdeaUser;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class UserService {

    @Autowired
    private UserDaoService userDaoService;
    @Autowired
    private RoleDaoService roleDaoService;
    @Autowired
    private MenuDaoService menuDaoService;

    /**
     * 获取用户的菜单集合
     *
     * @param userId 用户ID
     * @return
     */
    public List<SysMenuEntity> getUserMenuList(int userId) {
        // 获取用户的所有功能权限集合
        List<IdeaMenu> userFunctions = getUserFunctionList(userId);
        if (CollectionUtils.isEmpty(userFunctions)) {
            return new ArrayList<>();
        }
        // 所有功能列表中筛选出一级目录或菜单
        List<SysMenuEntity> menuList = userFunctions.stream()
                // 过滤留下父ID为0的的功能
                .filter(fun -> fun.getParentId() == 0)
                // 根据功能的排序值进行排序
                .sorted(Comparator.comparingInt(IdeaMenu::getOrderNum))
                // 映射为系统菜单对象
                .map(SysMenuEntity::createMenuEntity)
                // 归集为集合
                .collect(Collectors.toList());
        // 循环每个一级目录或菜单：筛选出对应的二级目录
        for (SysMenuEntity parentMenu : menuList) {
            final int parentId = parentMenu.getMenuId();
            List<SysMenuEntity> subList = userFunctions.stream()
                    // 过滤留下父ID为parentId的的功能
                    .filter(fun -> fun.getParentId() == parentId)
                    // 根据功能的排序值进行排序
                    .sorted(Comparator.comparingInt(IdeaMenu::getOrderNum))
                    // 映射为系统菜单对象
                    .map(SysMenuEntity::createMenuEntity)
                    // 归集为集合
                    .collect(Collectors.toList());
            parentMenu.setSubMenuList(subList);
        }
        return menuList;
    }

    /**
     * 根据登录用户名获取
     *
     * @param userName
     * @return
     */
    public Set<String> getUserPermissionsByName(String userName) {
        try {
            IdeaUser user = userDaoService.getUserByPhone(userName);
            if (user == null) {
                return new HashSet<>();
            }
            return getUserPermissions(user.getId());
        } catch (Exception e) {
            return new HashSet<>();
        }
    }

    /**
     * 获取用户的权限值集合
     *
     * @param userId
     * @return
     */
    public Set<String> getUserPermissions(int userId) {
        List<IdeaMenu> menuList = getUserFunctionList(userId);
        if (menuList == null || menuList.size() == 0) {
            return null;
        }
        // 获取用户的权限值集合
        Set<String> permsSet = menuList.stream()
                // 映射取出权限字符串
                .map(IdeaMenu::getPerms)
                // 过滤保留非空的权限字符串
                .filter(StringUtils::isNotEmpty)
                // 权限字符串进行逗号分割并返回流
                .flatMap(str -> Arrays.stream(str.split(",")))
                // 归集为Set集合
                .collect(Collectors.toSet());
        return permsSet;
    }

    /**
     * 获取用户所有的功能权限集合
     *
     * @param userId
     * @return
     */
    private List<IdeaMenu> getUserFunctionList(int userId) {
        // 获取用户的角色
        IdeaRole role = roleDaoService.getRoleByUserId(userId);
        if (role == null) {
            return null;
        }
        List<IdeaMenu> menuList = getMenuList(role);
        return menuList;
    }

    private List<IdeaMenu> getMenuList(IdeaRole role) {
        if (role.getRoleId() == 1) {
            // 用户的角色是超级管理员，则用户拥有所有权限；
            return menuDaoService.getAllMenu();
        } else {
            // 用户的角色不是超级管理员，则查询这个角色的权限
            return menuDaoService.getMenuByRole(role);
        }
    }
}
